﻿#pragma once

#include "Block.h"

// 游戏状态
typedef enum GameStatus {
    END,    // 已结束
    PAUSED, // 暂停中
    PLAYING // 游戏中
} GameStatus;

typedef struct Game Game;

typedef void (*GameDelete)(Game*);
typedef BOOL (*GameOnKeyPress)(Game*, UINT);
typedef void (*GameOnTimer)(Game*);
typedef void (*GamePause)(Game*);
typedef BOOL (*GamePlayMusic)(Game*);
typedef void (*GameStart)(Game*);

// 游戏
struct Game {
    HWND mCallback;         // 回调
    Block* mCurBlock;       // 当前方块
    int mDifficulty;        // 难度
    BOOL mEnableMusic;      // 音乐开关
    HWND mGameBoard;        // 游戏区域
    HDC mGameBoardDrawer;   // 游戏区域绘图者
    Block* mNextBlock;      // 下一个方块
    HWND mPreview;          // 预览区域
    HDC mPreviewDrawer;     // 预览区域绘图者
    int mScore;             // 得分
    GameStatus mStatus;     // 状态
    int mTop;               // 有方块的最高行

    GameDelete deleteSelf;
    GameOnKeyPress onKeyPressed;
    GameOnTimer onTimer;
    GamePause pause;
    GamePlayMusic playMusic;
    GameStart start;
};

Game* New_Game(HWND, HWND, HDC, HWND, HDC);
